import theano
import numpy as np
import theano.tensor as t
rng = np.random

# 为了测试，自己生成10个样本，每个样本是3维向量，然后用于训练
N = 10
feats = 3
D = (rng.randn(N, feats).astype(np.float32), rng.randint(size=N, low=0, high=2).astype(np.float32))
# 声明自变量x，以及每个样本对应的标签y（训练标签）
x = t.matrix('x')
y = t.vector('y')

# 随机初始化参数w、b=0， 为共享变量
w = theano.shared(rng.randn(feats), name='w')
b = theano.shared(0., name='b')

# 构造代价函数
p_1 = 1 / (1 + t.exp(-t.dot(x, w) - b))
# s激活函数
xent = -y * t.log(p_1) - (1 - y) * t.log(1 - p_1)
# 交叉熵代价函数
cost = xent.mean() + 0.01 * (w ** 2).sum()
# 代价函数的平均值+L2正则项以防过拟合，其中权重衰减系数为0.01
gw, gb = t.grad(cost, [w, b])
# 对代价函数求参数的偏导数
prediction = p_1 > 0.5
# 大于0.5预测为1，否则为0
train = theano.function(inputs=[x, y], outputs=[prediction, xent], updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb)))
predict = theano.function(inputs=[x], outputs=prediction)

# 训练
training_steps = 1000
for i in range(training_steps):
    pred, err = train(D[0], D[1])
    print(err.mean())




